#ifndef CHESSDEF_H
#define CHESSDEF_H

// 棋盘参数
// 棋盘行数
#define BOARD_ROW_NUM 10
// 棋盘列数
#define BOARD_COL_NUM 9
// 棋盘格直径
#define BOARD_RECT_DIAMETER 30
// 棋盘相距左边窗口偏移
#define BOARD_LEFT_OFFSET 40
// 棋盘相距上边窗口偏移
#define BOARD_TOP_OFFSET 40

// 棋子类型
enum class PIECES_TYPE {
    JIANG,
    CHE,
    PAO,
    MA,
    BING,
    SHI,
    XIANG,
    UnKnow
};

// 棋子总数
#define PIECES_NUM 32

// 棋子初始化
/* 0   1   2   3   4   5   6   7   8   [0]
 *                                     [1]
 *     9                       10      [2]
 * 11      12      13      14      15  [3]
 *                                     [4]
 *                                     [5]
 * 31      30      29      28      27  [6]
 *     26                      25      [7]
 *                                     [8]
 * 24  23  22  21  20  19  18  17  16  [9]
 */
// 所有棋子的初始属性
typedef struct piece_attr {
    int row;
    int col;
    PIECES_TYPE type;
} pieceAttr;

const pieceAttr board_attr[16] {
    {0, 0, PIECES_TYPE::CHE}, {0, 1, PIECES_TYPE::MA}, {0, 2, PIECES_TYPE::XIANG},
    {0, 3, PIECES_TYPE::SHI}, {0, 4, PIECES_TYPE::JIANG}, {0, 5, PIECES_TYPE::SHI},
    {0, 6, PIECES_TYPE::XIANG}, {0, 7, PIECES_TYPE::MA}, {0, 8, PIECES_TYPE::CHE},
    {2, 1, PIECES_TYPE::PAO}, {2, 7, PIECES_TYPE::PAO},
    {3, 0, PIECES_TYPE::BING}, {3, 2, PIECES_TYPE::BING}, {3, 4, PIECES_TYPE::BING},
    {3, 6, PIECES_TYPE::BING}, {3, 8, PIECES_TYPE::BING}
};

// 主界面窗口大小
#define MAIN_WIN_WIDTH 360
#define MAIN_WIN_HEIGHT 640
// 悔棋按钮大小
#define RETRACK_BUTTON_WIDTH 50
#define RETRACK_BUTTON_HEIGHT 30
// 主界面按钮大小
#define MAIN_BUTTON_WIDTH 200
#define MAIN_BUTTON_HEIGHT 40
// 返回按钮大小
#define BACK_BUTTON_WIDTH 60
#define BACK_BUTTON_HEIGHT 25

// AI难度级别
enum class Difficulty { Easy, Medium, Hard };
// 游戏结束结果
enum class GameResult { NoResult, RedWin, BlackWin, Draw };

// 长将或长捉次数
#define PERFECT_CHECK_NUM 3
//最长搜索时间
#define SEARCH_TIME_LIMIT_MS 5000
//匹配超时时间
#define MATCH_TIME_LIMIT_MS (5 * 60 * 1000)
// 局时
#define GAME_TIME_LIMIT_MS (20 * 60 * 1000)
// 步时
#define STEP_TIME_LIMIT_MS (60 * 1000)
// 指令类型枚举
enum class CommandType {
    // 心跳检测
    HEARTBEAT = 0x01,
    //错误响应
    ERROR = 0xFF,

    // 匹配相关
    // 匹配请求
    MATCH_REQUEST = 0x10,
    // 匹配成功
    MATCH_SUCCESS = 0x11,
    // 匹配失败
    MATCH_FAILED = 0x12,

    // 游戏指令
    // 棋步广播
    MOVE = 0x21,       // 原0x21
    // 悔棋请求
    UNDO_REQUEST = 0x22,
    // 提和请求
    DRAW_OFFER = 0x23,

    // 游戏状态
    // 游戏开始
    GAME_START = 0x30,
    // 游戏结束
    GAME_OVER = 0x31,
    // 游戏保存
    GAME_SAVE = 0x32
};

// 服务器域名
#define SERVER_DOMAIN ("127.0.0.1")
enum class  MatchResult {
    MATCH_SUCCESS,
    MATCH_FAILED,
    MATCH_WAITING,
    NO_MATCH
};


#endif // CHESSDEF_H
